#ifndef __AudioBuffQueue_H__
#define __AudioBuffQueue_H__


#include <list>
#include <vector>
#include "MutexLock.h"
struct Audio_Buff
{
	uint8_t* data;
	int64_t presentationTimeUs;
	int dataLen;
	int streamIndex;
};

//音频数据缓存
class AudioBuffQueue
{
public:
	AudioBuffQueue();
	~AudioBuffQueue();
    
    //设置音频流个数
	int setStreamSize(int size);
    int getStreamSize();
    //插入音频数据
	int inputBuff(uint8_t* data, int len, int streamIndex, int64_t presentationTimeUs);
    
    //移除顶部音频数据
	int popBuff();
    
    uint32_t getCacheCount();
    //获取顶部音频数据的pts
	int64_t getFrontPresentationTimeUs();
    
    //获取顶部音频数据
	int getFrontBuff(int indexA, uint8_t** pDataA, int* lenA,
                     int indexB, uint8_t** pDataB, int* lenB);
    
    //获取顶部音频数据，把所有音频流数据合并到一块内存
    int getFrontBuff(uint8_t** out_data,uint32_t* out_dataLen);
    
    
    
    /**
     判断音频队列里面是否存在该时间戳的音频帧

     @param sampleTimeUs pts
     @return 成功返回true，失败返回false
     */
    bool isHasSampleTimeUsData(int64_t sampleTimeUs);
    
    
    /**
     获取已解码未混合的数据的pts
     
     @param out_sampleTimeUs 输出参数，返回该帧的pts，单位微秒
     @return 成功返回true，失败返回false
     */
    bool outputSampleTimeUs(int64_t* out_sampleTimeUs);
    /**
     *  清理缓存
     */
    void clean();
private:
	bool checkAlignment(int64_t presentationTimeUs);
	bool checkAlignmentAll();
private:
	std::vector<std::list<Audio_Buff > > _audioQueueList;	//未对齐前的音频缓存
    /**
     *  对齐后的音频数据
     *  std::vector<Audio_Buff>存放对齐后的一帧数据，每条音频的一个帧的数据，
     ＊ 而且它们的pts也是相同的
     ＊
     */
	std::list<std::vector<Audio_Buff> > _alignmentQueue;    //
    
    std::list<int64_t> _sampleTimeUss;    //
	MutexLock _lock;                //临界区锁
    
    uint8_t* _tempBuff;
    uint32_t _tempBuffLen;

};
#endif //__AudioBuffQueue_H__
